﻿using System.Collections.Generic;
using System.Data;

namespace ExcelReporting
{
    /// <summary>
    /// Представляет документ Excel и операции с ним
    /// </summary>
    public interface IExcelDocument
    {
        /// <summary>
        /// Экспорт таблицы целиком по координате начала
        /// </summary>
        /// <remarks>
        /// На листе в ячейках будет записанно все содержимое таблицы. 
        /// Индекс начала(левый верхний угол) позволит поместить заголовки и т.п.,  а также экспортировать несколько таблиц
        /// </remarks>
        /// <param name="table">Таблица с данными</param>
        /// <param name="startRowIndex">Номер строки, с которой начинается блок данных</param>
        /// <param name="startColumnIndex">Номер столбца, с которого начинается блок данных</param>
        void CopyDataTable(DataTable table, int startRowIndex, int startColumnIndex);

        /// <summary>
        /// Задает и получает текстовое значение ячейки
        /// </summary>
        /// <param name="row">Ряд</param>
        /// <param name="column">Колонка</param>
        /// <returns>Значение</returns>
        object this[int row, int column] { get; set; }

        /// <summary>
        /// Задает в ячейке число денежного формата с разделителем
        /// </summary>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <param name="value"></param>
        void SetCurrencyValue(int row, int column, double value);

        /// <summary>
        /// Записывает в ячейку переданное число
        /// </summary>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <param name="value"></param>
        void SetIntegerValue(int row, int column, int value);

        /// <summary>
        /// Задает один новый стиль в указанном блоке ячеек
        /// </summary>
        /// <remarks>
        /// Координаты - для выделения блока ячеек, к которым нужно применить стили
        /// Внимание - множественное создание стилей(recreateStyles = true) - ведет к выбросу ошибки(в данном случае при > 4000 стилей)
        /// </remarks>
        /// <param name="styleModes">Параметры стиля</param>
        /// <param name="recreateStyles">Нужно ли пересоздавать стиль, если нет, то модифицируется старый</param>
        void SetStyle(int startRow, int endRow, int startColumn, int endColumn, IEnumerable<StyleModes> styleModes, bool recreateStyles = true);

        /// <summary>
        /// Освобождение ресурсов, подготовка приложения
        /// </summary>
        void EndProcessing(bool openFileOnCreate);

        /// <summary>
        /// Задает высоту строки
        /// </summary>
        /// <param name="rowIndex">Индекс строки</param>
        /// <param name="height">Высота примерно в 10хПикселей (255 = строка)</param>
        void SetRowHeight(int rowIndex, short height);

        /// <summary>
        /// Выбор листа
        /// </summary>
        /// <param name="sheetIndex"></param>
        void SelectSheet(int sheetIndex);
    }

    public enum StyleModes
    {
        /// <summary>
        /// Жирный
        /// </summary>
        Bold,
        /// <summary>
        /// Черные границы со всех сторон
        /// </summary>
        SimpleBorders,
        /// <summary>
        /// Объединение блока ячеек
        /// </summary>
        Merged,
        RightHorizontalAlignment,
        CenterHorizontalAlignment,
        TopVerticalAlignment,
        /// <summary>
        /// Ячейка с данными денежного формата
        /// </summary>
        CurrencyDataFormat,
        /// <summary>
        /// Ячейка с целочисленными данными
        /// </summary>
        IntegerDataFormat,
    }
}
